Tema 03 - Datos ordenados con tidyr

Técnicas para ‘Big Data’ en Economía - Curso 2023/24
Universidad de Alicante

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

¿Qué son datos ordenados (‘tidy data’)?

  • Los conjuntos rectangulares de datos son tablas con datos ordenados:

1.- Cada columna es una variable: mide el mismo atributo entre unidades

2.- Cada fila es una observación (caso): misma unidad a través de atributos

3.- Cada celda es un valor

  • Tendremos información similar y no redundante en una misma tabla

  • Y se completa la información con uniones a tablas adicionales (ej., para variables codificadas)

Datos no ordenados

  • Otras estructuras pueden tener sentido para mostrar información (o por convenciones)

  • Un ejemplo del portal de datos abiertos del Gobierno de España

  • La visualización es atractiva, PERO sobran filas para analizar los datos

Cuatro representaciones de los mismos datos

library(tidyverse)
table1     # datos ordenados
table2     # no tiene un valor por celda

Cuatro representaciones (cont.)

table3     # mezcla más de una variable en una columna
table4a 
table4b
  • table4a y table4b ofrecen información útil para presentación, pero
    • variables tanto en filas como columnas
    • las cabeceras de columna son valores, no nombres de variables.

Ventajas de datos ordenados

  • La mayoría de las funciones R (y otros lenguajes) trabajan con vectores: los datos ordenados son una forma natural (variable = vector columna)
table1$cases                   # table1 %>% select(cases)
table2$count[c(1,3,5,7,9,11)]  # table2 %>% filter(type == "cases") %>%
                               #            select(count)
c(table4a$`1999`, table4a$`2000`)
# crear variables es fácil
table1 %>% mutate(rate = cases / population * 10000)  
  • tidyverse es eficiente con datos ordenados: ej., gráfico temporal
ggplot(table1, aes(x = year, y = cases)) +  
  geom_line(aes(colour = country))

Mismos datos, dos formatos: ancho o largo

  • La utilidad de almacenar los datos en un rectángulo ancho (“wide”) o en uno largo (“long”“) depende de qué queramos hacer

  • El cambio de forma entre formatos es una tarea habitual del analista de datos.

  • Cambiar entre representación larga y ancha se conoce como pivotar (o girar)

table4a        # formato ancho
table1         # formato largo

pivot_longer(): de ancho a largo

  • Pivotar las variables no ordenadas en dos nuevas columnas (deben crearse)
pivot_longer(table4a, 
             cols=2:3, 
             names_to = "year", 
             values_to = "cases") 
  1. data frame a cambiar de forma

  2. nombres o índices de las columnas que representan valores, no variables

  3. los nombres de esas antiguas variables van como valores a nueva variable

  4. los valores de las antiguas celdas van a otra nueva variable

  • Para recuperar table1, se debería pivotar también table4b y unir ambas

pivot_longer(): de ancho a largo (cont.)

  • Recordatorio: formas equivalentes de hacer lo mismo
pivot_longer(table4a, 2:3, names_to = "year", values_to = "cases")       
table4a %>% pivot_longer(c(`1999`, `2000`), values_to = "cases", names_to = "year")
table4a %>% pivot_longer(names_to = "year", values_to = "cases", -country)
table4a %>% pivot_longer(names_to = "year", values_to = "cases", `1999`:`2000`)
  • Notar que los nombres de columna son caracteres y cuando son números van entre ` (evita confusión con índice de posición)
  • Deberíamos cambiar el tipo de las nuevas variables
pivot_longer(table4a, 2:3, names_to = "year", values_to = "cases") %>%
  mutate(year= parse_number(year))

pivot_wider(): de largo a ancho

table2 %>%
    pivot_wider(names_from = type,  
                values_from = count)
  1. el data frame a cambiar de forma
  2. nombre de la variable de cuyos valores vienen los nuevos nombres de columnas
  3. nombre de la variable de la que tomar los valores para las nuevas columnas
  • Aplicado a table2 sirve para limpiar datos con observaciones que se dispersan en varias filas
table1 %>% select(-population) %>%            # Tabla de presentación para casos
    pivot_wider(names_from = year, values_from = cases)   

Dos funciones útiles

  • separate(): dividir una columna en múltiples variables indicando un separador o vector de posiciones en las que dividir
table3 %>% separate(rate, into = c("cases", "population"), sep = "/")
table5 <- table3 %>% separate(year, into = c("century", "year"), sep = 2)
  • Con el argumento convert = TRUE intenta convertir el tipo de datos (no mantener carácter)
table3 %>% separate(rate, into = c("cases", "population"), convert = TRUE)
  • unite(): combinar múltiples columnas en una
table5 %>% 
  unite(new, century, year, sep = "-")

Comentario sobre valores ausentes

accion <- tibble( anio  = c(2015, 2015, 2015, 2015, 2016, 2016, 2016),
                  trim  = c(   1,    2,    3,    4,    2,    3,    4),
                  rent  = c(1.88, 0.59, 0.35,   NA, 0.92, 0.17, 2.66))
  • Dos tipos de valores ausentes: en 2015.Q4 explícitos y en 2016.Q1 implícitos

  • Esto cambia con la forma de representación

ancho <- accion %>% 
            pivot_wider(names_from = anio, values_from = rent)     
ancho             # NA explícitos al convertir a formato ancho

ancho %>%  pivot_longer(cols = c("2015","2016"), 
                        names_to = "anio", values_to = "rent")

accion %>% complete(anio, trim)  # todos NA explícitos 
                                 # (rellena buscando todas combinacines)